#include "Head.h"

const wchar_t *title_modify = {L"修改航班"};
const wchar_t *choices_modify[] = {
    L"选项1 - 修改票价",
    L"选项2 - 修改起飞时间",
    L"选项3 - 修改剩余票数",
    L"选项4 - 修改航班状态"};

// 增加航班
void Flight_Add(Flight_Head_Node *Head)
{
    system("clear");
    printf("请输入你要添加的航班信息\n");
    Flight_data add;
    printf("机型        起点    终点    起飞时间        到达时间        票价    额定座位\n");
    scanf("%s   %s  %s  %d:%d   %d:%d   %d  %d",
          add.flighttype, add.startcity, add.arrivecity,
          &add.starttime[0], &add.starttime[1], &add.arrivetime[0], &add.arrivetime[1],
          &add.value, &add.maxNUM);

    // 计算双向循环链表长度 航班班次
    Flight_Node *ptr = Head->next;
    int len = 1;
    do
    {
        ptr = ptr->next;
        len++;
    } while (ptr->next != Head->next);
    add.id = ++len;

    // 计算飞行时间
    char min[4];
    char hour[4];
    if (add.starttime[1] <= add.arrivetime[1]) // 起飞时间 (分钟) 小于等于 到达时间 (分钟)
    {
        sprintf(min, "%d", (add.arrivetime[1] - add.starttime[1])); // 分 将整形 修改为 字符串型 赋给min
        strcat(min, "m");
        sprintf(hour, "%d", (add.arrivetime[0] - add.starttime[0])); // 时 将整形 修改为 字符串型 赋给hour
        strcat(hour, "h");

        strcpy(add.flytime, strcat(hour, min)); // 飞行时间
    }
    else // 起飞时间 (分钟) 大于 到达时间 (分钟)
    {
        sprintf(min, "%d", 60 - (add.starttime[1] - add.arrivetime[1])); // 分 将整形 修改为 字符串型 赋给min
        strcat(min, "m");
        sprintf(hour, "%d", (add.arrivetime[0] - add.starttime[0] - 1)); // 时 将整形 修改为 字符串型 赋给hour
        strcat(hour, "h");

        strcpy(add.flytime, strcat(hour, min)); // 飞行时间
    }

    // 剩余座位
    add.leftbuyersa = add.maxNUM;

    // 是否起飞
    add.whetherfly = 'n';

    // 写入双向循环链表
    Insert_dlist(Head, add, 1);
    // 写入文件
    File_Printf_Flight(Head);
}

// 删除航班
void Flight_Del(Flight_Head_Node *Head)
{
    system("clear");

    // 显示所有航班
    Print_dlist(Head);

    int idx = 0;
    int pos = 0;

    printf("请输入要删除的航班班次");
    scanf("%d", &idx);
    Flight_Node *ptr = Find_by_id(Head, idx); // 查找航班班次
    if (ptr == NULL)
    {
        printf("\33[1m\33[31m未查询该航班班次\33[0m\n");
    }

    Flight_Node *ptr_find = Head->next;
    // 遍历出 ptr 是 第几个
    while (1)
    {
        if (ptr->data.id == ptr_find->data.id)
        {
            pos++;
            break;
        }
        pos++;
        ptr_find = ptr_find->next;
    }

    Del_dlist(Head, pos);

    // 写入文件
    File_Printf_Flight(Head);

    if (Find_by_id(Head, idx) == NULL)
    {
        printf("删除成功\n");
    }
    else
    {
        printf("\33[1m\33[31m删除失败\33[0m\n");
    }
    return;
}

// 修改航班
void Flight_Modify(Flight_Head_Node *Head)
{
    system("clear");

    // 显示所有航班
    Print_dlist(Head);

    int idx = 0;  // 选择航班班次
    int mode = 0; // 选择模式

    printf("请输入要修改的航班的班次:");
    scanf("%d", &idx);

    Flight_Node *ptr = Find_by_id(Head, idx); // 将查找到的 航班信息地址 给ptr

    mode = display_menu(title_modify, choices_modify, 4); // 选择修改模式

    // 修改票价
    int value = 0;

    // 修改的时间
    int min_int = 0;
    int hour_int = 0;
    char min[4];
    char hour[4];

    // 修改剩余票数
    int residue = 0;

    // 修改航班状态
    char whetherfly;

    // 错误次数
    int err = 0;

    switch (mode)
    {
    case 1:
        // 修改票价
        printf("将票价修改为:");
        scanf("%d", &value);
        ptr->data.value = value;

        // 写入文件
        File_Printf_Flight(Head);
        break;

    case 2:
        // 修改航班起飞时间
        printf("起飞时间修改为: (时:分)\n");
        scanf("%d:%d", &hour_int, &min_int);
        ptr->data.starttime[1] = min_int;
        ptr->data.starttime[0] = hour_int;

        // 修改预计降落时间
        printf("降落时间修改为: (时:分)\n");
        scanf("%d:%d", &hour_int, &min_int);
        ptr->data.arrivetime[1] = min_int;
        ptr->data.arrivetime[0] = hour_int;

        // 计算预计飞行时间 并修改
        if (ptr->data.starttime[1] <= ptr->data.arrivetime[1]) // 起飞时间 (分钟) 小于等于 到达时间 (分钟)
        {
            sprintf(min, "%d", (ptr->data.arrivetime[1] - ptr->data.starttime[1])); // 分 将整形 修改为 字符串型 赋给min
            strcat(min, "m");
            sprintf(hour, "%d", (ptr->data.arrivetime[0] - ptr->data.starttime[0])); // 时 将整形 修改为 字符串型 赋给hour
            strcat(hour, "h");

            strcpy(ptr->data.flytime, strcat(hour, min)); // 修改预计飞行时间
        }
        else // 起飞时间 (分钟) 大于 到达时间 (分钟)
        {
            sprintf(min, "%d", 60 - (ptr->data.starttime[1] - ptr->data.arrivetime[1])); // 分 将整形 修改为 字符串型 赋给min
            strcat(min, "m");
            sprintf(hour, "%d", (ptr->data.arrivetime[0] - ptr->data.starttime[0]) - 1); // 时 将整形 修改为 字符串型 赋给hour
            strcat(hour, "h");

            strcpy(ptr->data.flytime, strcat(hour, min)); // 修改预计飞行时间
        }

        // 写入文件
        File_Printf_Flight(Head);
        break;

    case 3:
        // 修改剩余票数
        printf("将剩余票数修改为:");
        scanf("%d", &residue);
        ptr->data.leftbuyersa = residue;

        // 写入文件
        File_Printf_Flight(Head);
        break;

    case 4:
        // 修改航班状态
        while (1)
        {
            printf("将飞行状态修改为: (y or n)");
            getchar(); // 吃回车
            scanf("%c", &whetherfly);
            if (whetherfly == 'y' || whetherfly == 'n') // 如果输入了其他 报错
            {
                ptr->data.whetherfly = whetherfly;

                // 写入文件
                File_Printf_Flight(Head);
                break;
            }
            printf("\33[1m\33[31m输入格式有误!!!\33[0m\n");
            err++;
            if (err == 3)
            {
                printf("\33[1m\33[41m傻子也能当管理员了?\33[0m\r");
                fflush(stdout);
                sleep(2);
                exit(0); // 正常退出程序
            }
        }
        break;

    default:
        break;
    }
}

// 按时间排序航班
void Flight_Sort(Flight_Head_Node *Head)
{
    // 从早到晚排序

    // 计算双向循环链表长度
    Flight_Node *ptr = Head->next;
    int len = 1;
    do
    {
        ptr = ptr->next;
        len++;
    } while (ptr->next != Head->next);

    // 储存 所有航班信息
    Flight_data arr[len];
    memset(arr, 0, len * sizeof(Flight_data)); // 初始化

    // ptr指向第一个节点
    ptr = Head->next;

    // 将所有航班信息存入数组
    int i = 0;
    do
    {
        arr[i] = ptr->data;
        ptr = ptr->next;
        i++;
    } while (ptr != Head->next);

    // 排序数组
    Flight_data box;
    // 先按 起飞时间 小时 从小到大 排序
    for (size_t i = 0; i < len - 1; i++)
    {
        for (size_t j = 0; j < len - i - 1; j++)
        {
            if (arr[j].starttime[0] > arr[j + 1].starttime[0]) // j 比 j+1 大 交换位置
            {
                box = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = box;
            }
        }
    }
    // 如果 起飞时间 小时 相等 则 在按分钟排
    for (size_t i = 0; i < len - 1; i++)
    {
        for (size_t j = 0; j < len - i - 1; j++)
        {
            if (arr[j].starttime[0] == arr[j + 1].starttime[0]) // arr[j].starttime[0] = arr[j+1].starttime[0]
            {
                if (arr[j].starttime[1] > arr[j + 1].starttime[1])
                {
                    box = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = box;
                }
            }
        }
    }

    // 清空双向循环链表
    Empty_dlist(Head);

    // 将排序好的数据 依次插入 链表
    for (size_t i = 0; i < len; i++)
    {
        // arr[i].id = i + 1;
        Insert_dlist(Head, arr[i], i + 1);
    }

    // 写入文件
    File_Printf_Flight(Head);
}
